<?php


namespace App\Http\Controllers\Business;


use App\Http\Controllers\Controller;
use App\Models\Api\Files;
use App\Models\Business\Business;
use App\Models\Business\BusinessImage;
use App\Models\Business\Food;
use App\Models\Business\FoodClassificationFirst;
use App\Models\Business\FoodClassificationHe;
use App\Models\Business\FoodImage;
use Illuminate\Database\QueryException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Validator;
/**
 * @group 商品信息
 *
 * 采用 restful api
 *
 * Body Parameters 表示请求的所需要的参数
 *
 * Query Parameters 表示返回参数的名称
 */
class FoodInfoController extends Controller
{
    /**
     * 商品查看
     *
     * @queryParam  food_item 商品货号
     * @queryParam  food_id 商品id
     * @queryParam  name 商品名称
     * @queryParam  body 食品介绍
     * @queryParam  food_num 食品库存
     * @queryParam  num 食品销量
     * @queryParam  color 颜色
     * @queryParam  number  数量 默认0
     * @queryParam  brand_id 食品品牌id
     * @queryParam  category_id 类目id
     * @queryParam  price 价格
     * @queryParam  sort 排序
     * @queryParam  Recommend 是否推荐  0 不推荐 1推荐
     * @queryParam  new_products 是否新品 0不是 1是
     * @queryParam  market_price 市场价格
     * @queryParam  hot_sale  是否热卖 0不是 1是
     * @queryParam  status  是否上架 0下架 1上架
     * @queryParam  food_classification_id 分类
     * @queryParam  image 食品图片
     * @queryParam  abbreviation 食品缩略图片
     * @queryParam  classification-》classification 所属分类
     * @queryParam  business  对应商家信息
     * @queryParam category-》name  对应类目
     *
     * @bodyParam search string  商品名称
     * @bodyParam business_id int  商家id
     */
    public function index(Request $request){
        $query = Food::with('image')->with('business')->where(
            function ($q) use($request){
                $request->has('search') && $q->where('name','like',"%{$request->get('search')}%");
                $request->has('business_id') && $q->where('business_id',$request->get('business_id'));
                $request->user_type ==2 && $q->where('business_id','=',$request->user_id);
            });
        if ($request->user_type ==2){
            return response()->json($query->get(),200);
        }
        return response()->json(pageQuery($query,$request),200);
    }

    /**
     * 商品查看
     *
     * @queryParam  food_id 商品id
     * @queryParam  food_item 商品货号
     * @queryParam  name 商品名称
     * @queryParam  body 食品介绍
     * @queryParam  food_num 食品库存
     * @queryParam  num 食品销量
     * @queryParam  color 颜色
     * @queryParam  number  数量 默认0
     * @queryParam  brand_id 食品品牌id
     * @queryParam  category_id 类目id
     * @queryParam  price 价格
     * @queryParam  sort 排序
     * @queryParam  Recommend 是否推荐  0 不推荐 1推荐
     * @queryParam  new_products 是否新品 0不是 1是
     * @queryParam  market_price 市场价格
     * @queryParam  hot_sale  是否热卖 0不是 1是
     * @queryParam  status  是否上架 0下架 1上架
     * @queryParam  food_classification_id 分类
     * @queryParam  image 食品图片
     * @queryParam  abbreviation 食品缩略图片
     * @queryParam  classification-》classification 所属分类
     * @queryParam  business  对应商家信息
     * @queryParam category-》name  对应类目
     * @queryParam sale 相关推荐
     *
     */

    public function show($pk){
        $data = Food::with('classification')->with('business')->with('category')->with('image')->find($pk);
       $data['sale']=Food::with('image')->where('id','!=',$pk)
           ->inRandomOrder()->take(3)->get();
        if($data == []){
            return response()->json(["message"=>"没有该信息"],404);
        }else{
            return response()->json($data,200);
        }
    }

    /**
     * 商品添加
     *
     * @bodyParam  food_id int required 商品id
     * @bodyParam  food_item int required 商品货号
     * @bodyParam  name string required 商品名称
     * @bodyParam  body string required 食品介绍
     * @bodyParam  color string required 颜色
     * @bodyParam  food_num int required 食品库存
     * @bodyParam  num int required 食品销量
     * @bodyParam  brand_id int required 食品品牌id
     * @bodyParam  category_id int required 类目id
     * @bodyParam  price int required 价格
     * @bodyParam  sort int required 排序
     * @bodyParam  Recommend int required  是否推荐  0 不推荐 1推荐
     * @bodyParam  new_products int required  是否新品 0不是 1是
     * @bodyParam  market_price int required 市场价格
     * @bodyParam  hot_sale int required   是否热卖 0不是 1是
     * @bodyParam  status int required   是否上架 0下架 1上架
     * @bodyParam  class json required 分类
     * @bodyParam  image int required 食品图片
     * @bodyParam  abbreviation int  食品缩略图片
     * @bodyParam  business_id int required   对应商家id 商家不用传，管理员要传
     *
     * 501 用户不能访问
     * 502 获取角色失败
     * 503 商家没有权限添加状态值
     * 504 添加商品失败
     * 505 添加中间表失败
     * 506 添加商品失败
     * 507 添加分类失败
     * 508 添加失败
     */
    public function store(Request $request)
    {
        try{
            $e = genValidate();
            $validator = Validator::make($request->all(),$e);
            if($validator->fails()){
                return response()->json($validator->errors()->messages(),400);
            }
            DB::beginTransaction();

            $data=$request->all();
            if (!$request->get('business_id')){
                $data['business_id']=$request->user_id;
            }
            if ($request->get('class')!=null){
                unset($data['class']);
            }
            if ($request->get('image')!=null){
                $image=json_decode($request->get('image'),  true);
                unset($data['image']);
                $id=Food::insertGetId($data);
                if (!$id){
                    DB::rollBack();
                    return response()->json(["message"=>"添加商品失败"],504);
                }
                foreach ($image as $k=>$v){
                    $value=array(
                        'food_id'=>$id,
                        'image_id'=>$v
                    );
                    $img=FoodImage::create($value);
                    if (!$img){
                        DB::rollBack();
                        return response()->json(["message"=>"添加中间表失败"],505);
                    }
                }

            }else{
                $id=Food::insertGetId($data);
                if (!$id){
                    DB::rollBack();
                    return response()->json(["message"=>"添加商品失败"],506);
                }
            }

            if ($request->get('class')){
                $class=json_decode($request->get('class'),true);
                foreach($class as $k=>$v){
                    $class_v=array(
                        'food_id'=>$id,
                        'classification_id'=>$v
                    );
                    $cla_bus=FoodClassificationHe::insertGetId($class_v);
                    if (!$cla_bus){
                        DB::rollBack();
                        return response()->json(["message"=>"添加分类失败"],507);
                    }
                }
                }
            DB::commit();
            return response()->json(["message"=>"添加成功"],200);
        }catch (QueryException $e){
            DB::rollBack();
            return response()->json(["message"=>"添加失败"],508);
        }
    }

    /**
     * 商品修改
     *
     * @bodyParam  food_id int  商品id
     * @bodyParam  food_item int 商品货号
     * @bodyParam  name string 商品名称
     * @bodyParam  body string 食品介绍
     * @bodyParam  color string  颜色
     * @bodyParam  food_num int 食品库存
     * @bodyParam  num int  食品销量
     * @bodyParam  brand_id int 食品品牌id
     * @bodyParam  category_id int 类目id
     * @bodyParam  price float 价格
     * @bodyParam  sort int 排序
     * @bodyParam  Recommend int 是否推荐  0 不推荐 1推荐
     * @bodyParam  new_products int 是否新品 0不是 1是
     * @bodyParam  market_price int 市场价格
     * @bodyParam  hot_sale  int 是否热卖 0不是 1是
     * @bodyParam  status  int 是否上架 0下架 1上架
     * @bodyParam  class json 分类
     * @bodyParam  image int 食品图片
     *
     * 503 商家没有权限添加状态值
     * 504 删除图片失败
     * 505 添加中间表失败
     * 506 删除分类中间表失败
     * 507 添加分类中间表失败
     * 508 修改失败
     */
    public function update(Request $request, $pk){
        $type=$request->user_type;
     if ($request->get('status')){
            if ($type ==2)
                return response()->json(["message"=>"商家没有权限修改状态值"],503);
        }
        $e = genValidate();
        $validator = Validator::make($request->all(),$e);
        if($validator->fails()){
            return response()->json($validator->errors()->messages(),400);
        }
        $carkind = food::find($pk);
        if($carkind == []){
            return response()->json(["message"=>"没有该信息"],404);
        }
        $data=$request->all();
        unset($data['user_id']);unset($data['user_type']);
        try {
            DB::beginTransaction();
            if ($request->get('image')){
                unset($data['image']);
                $image=json_decode($request->get('image'),true);
                foreach($image as $k=>$v) {
                    if ($v['id']!=null){
                        $business_delete=FoodImage::where('image_id',$v['id'])->delete();
                        $image_delete=Files::where('id',$v['id'])->delete();
                        if ( $business_delete == false ||$image_delete == false){
                            DB::rollBack();
                            return response()->json(["message"=>"删除图片失败"],504);
                        }
                    }else{
                        $value=array(
                            'food_id'=>$pk,
                            'image_id'=>$v
                        );
                        $img=FoodImage::insertGetId($value);
                        if (!$img){
                            DB::rollBack();
                            return response()->json(["message"=>"添加中间表失败"],505);
                        }
                    }
                }
            }

            if ($request->get('class')){
                $class=json_decode($request->get('class'),true);
                unset($data['class']);
                foreach ($class as $k=>$v){
                    if ($v['id']!=null){
                        $class_v=array(
                            'food_id'=>$pk,
                            'classification_id'=>$v['id']
                        );
                        $delete=FoodClassificationHe::where($class_v)->delete();
                        if (!$delete){
                            DB::rollBack();
                            return response()->json(["message"=>"删除分类中间表失败"],506);
                        }
                    }else{
                        $class_v=array(
                            'food_id'=>$pk,
                            'classification_id'=>$v
                        );
                        $insert=FoodClassificationHe::insertGetId($class_v);
                        if (!$insert){
                            DB::rollBack();
                            return response()->json(["message"=>"添加分类中间表失败"],507);
                        }
                    }
                }
            }
            DB::commit();
            $carkind->update($data);
            return response()->json(["message"=>"修改成功"],200);
        }catch (QueryException $e){
            DB::rollBack();
            return response()->json($e->getMessage(),508);
        }
    }

    /**
     * 商品信息删除
     *
     */

    public function destroy($pk){

        $data = Food::find($pk);
        if($data == []){
            return response()->json(["message"=>"没有该信息"],404);
        }
        Food::where('id',$pk)->delete();
        return response()->json(["message"=>"删除成功"],200);
    }
    /**
     * 商品删除（多个）
     *
     * @bodyParam  id json optional 商品id {"0":{"id":23},"1":{"id":24}}
     *
     */
    public function alldelete(Request $request){
        DB::beginTransaction();
        $business=json_decode($request->get('id'),true);
        foreach ($business as $k=>$v){
            $data=Food::find($v['id']);
            if($data == []){
                DB::rollBack();
                return response()->json(["message"=>"没有该信息"],404);
            }
            $data->delete();
        }
        DB::commit();
        return response()->json(["message"=>"删除成功"],200);
    }
}
